<?php

/**
 * Проверяет загруженный файл.
 *
 */
class Kernel_Validator_File extends Kernel_Validator_Abstract
{
    /**
     * Максимальный разрешенный размер файла.
     *
     * @var integer
     */
    public $max_size;

    /**
     * Разрешенные для загрузки расширения. Если пустой - игнорируется.
     *
     * @var array
     */
    public $ext_allowed = array();

    /**
     * Запрещенные для загрузки расширения.
     *
     * @var array
     */
    public $ext_denied = array();

    /**
     * Проекция кодов ошибок, которые могут возникнуть при загрузке файла на
     * сообщения об ошибках.
     *
     * @var array
     */
    static private $_messages = array(
        UPLOAD_ERR_OK         => 'UPLOAD_ERR_OK',
        UPLOAD_ERR_INI_SIZE   => 'UPLOAD_ERR_INI_SIZE',
        UPLOAD_ERR_FORM_SIZE  => 'UPLOAD_ERR_FORM_SIZE',
        UPLOAD_ERR_PARTIAL    => 'UPLOAD_ERR_PARTIAL',
        UPLOAD_ERR_NO_FILE    => 'UPLOAD_ERR_NO_FILE',
        UPLOAD_ERR_NO_TMP_DIR => 'UPLOAD_ERR_NO_TMP_DIR',
        UPLOAD_ERR_CANT_WRITE => 'UPLOAD_ERR_CANT_WRITE',
        UPLOAD_ERR_EXTENSION  => 'UPLOAD_ERR_EXTENSION',
    );

    /**
     * Проверяет правильность указанного значения
     *
     * @param   Kernel_Form_Value_File   $file
     * @throws  Kernel_Validator_Exception
     */
    protected function _validate($file) {
        $this->_upload($file);
        $this->_extension($file);
        $this->_size($file);
    }

    /**
     * Проверяет успешность загрузки файла.
     *
     * @param   Kernel_Form_Value_File   $file
     * @throws  Kernel_Validator_Exception
     */
    private function _upload($file) {
        // если файл не был успешно загружен на сервер
        if (!$file->successful()) {
            // выдаем текстовое представление ошибки
            $this->_error(__(self::$_messages[$file->getError()]));
        }
    }

    /**
     * Проверяет расширение файла.
     *
     * @param   Kernel_Form_Value_File   $file
     * @throws  Kernel_Validator_Exception
     */
    private function _extension($file) {
        $extenstion = $file->getExtension();
        if ((!empty($this->ext_allowed) && !in_array($extenstion, $this->ext_allowed)) || in_array($extenstion, $this->ext_denied)) {
            $this->_error(__('VALIDATION_ERROR_UPLOAD_EXTENSION', $extenstion));
        }
    }

    /**
     * Проверяет размер файла.
     *
     * @param   Kernel_Form_Value_File   $file
     * @throws  Kernel_Validator_Exception
     */
    private function _size($file) {
        if ($this->max_size > 0 && $file->getSize() > $this->max_size) {
            $this->_error(__('VALIDATION_ERROR_UPLOAD_MAXSIZE', $this->max_size));
        }
    }
}
